import json
from openai import OpenAI

client = OpenAI(
    api_key="sk-48fdd873e14d4297bcc3e1c86a332352",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

def llm_extend(content):
    prompt = f"""你是一位资深的农业技术顾问。请仔细分析以下原始用户画像，并生成一个增强版的摘要。

[原始画像]:
{content}

[你的任务]:
1.  **识别核心信息**: 提取用户的基本情况，如作物类型、规模、地区、技术水平。
2.  **推断潜在需求**: 基于用户的痛点（如成本高、劳动力老龄化）和期望（如绿色认证、品牌建设），推断出他们对哪些类型的技术或知识最感兴趣（例如：节约成本的技术、省力高效的机械、提升产品附加值的方法等）。
3.  **生成增强摘要**: 将以上分析整合成一段连贯、信息密集的文本。这段摘要应清晰地描绘出用户的核心诉求和技术偏好，以便于精准匹配知识资源。

请直接输出增强后的摘要文本。"""

    response = client.chat.completions.create(
        # model="deepseek-chat",
        model="qwen-turbo-latest",
        messages=[
            {
                "role": "system",
                "content": "You are a senior agricultural technology consultant tasked with creating an enhanced, insightful summary of a user profile.",
            },
            {"role": "user", "content": prompt},
        ],
        stream=False,
        temperature=0.0,
    )
    return response.choices[0].message.content

from src.utils.time_tool import get_china_time

def _get_current_season():
    """根据当前月份判断季节"""
    month = get_china_time().month
    if month in [3, 4, 5]:
        return "春季"
    elif month in [6, 7, 8]:
        return "夏季"
    elif month in [9, 10, 11]:
        return "秋季"
    else:
        return "冬季"

def llm_generate_batch_summaries(user_info, articles_data):
    """
    一次性为多篇文章生成高度个性化的摘要，包含推荐上下文。

    :param user_info: 用户信息字典
    :param articles_data: 文章数据列表，每个元素是包含 'id', 'content', 'process', 'keyword' 的字典
    :return: 一个字典，键是文章id，值是生成的摘要
    """
    season = _get_current_season()

    articles_text = ""
    for article in articles_data:
        articles_text += f"--- Article Start (ID: {article['id']}) ---\n"
        articles_text += f"[Recommendation Context]: Process='{article['process']}', Keyword='{article['keyword']}'\n"
        articles_text += f"[Article Content]: {article['content']}\n"
        articles_text += f"--- Article End (ID: {article['id']}) ---\n\n"

    prompt = f"""你是一位顶级的农业内容个性化推荐专家。你的任务是为特定用户，在特定季节，对下面提供的多篇文章进行个性化解读，并为每一篇生成一个高度相关的摘要。

[用户信息]:
{user_info}

[当前季节]:
{season}

[文章列表与推荐背景]:
{articles_text}

[你的任务]:
1.  **理解上下文**: 仔细阅读用户信息、季节背景，以及每篇文章的推荐背景（Process 和 Keyword）。
2.  **生成摘要**: 对列表中的每一篇文章，生成一段50-80字的个性化摘要。
3.  **融入推荐背景**: 在摘要中，必须巧妙地融入推荐背景信息。要让用户明白，这篇文章是基于他关心的“流程”（Process）中的具体“关键词”（Keyword）而被推荐的。
4.  **禁止使用人名或称呼**: 在生成的摘要中，严禁使用任何形式的人名或称呼（如“您”、“陈师傅”等）。摘要应直接陈述内容。
5.  **提高多样性**: 请使用多样化的句式和表达方式来呈现推荐背景和文章内容，避免固定模式和重复。
6.  **严格JSON输出**: 你的输出必须是一个单一的JSON对象。键是文章的ID，值是为该文章生成的个性化摘要。

[输出格式示例]:
{{
  "0": "针对“精细化生产”中的“变量施肥”技术，本文介绍了如何在春耕时节精准控制成本，实现更好的收成。",
  "1": "在“品牌营销”方面，本文介绍了如何利用“区域品牌”提升价值，非常值得一看。",
  "2": "关于“智慧农业”中“产量预测”的分析，本文能为冬季规划提供重要参考。"
}}

请直接输出JSON对象，不要包含任何其他解释或注释。"""

    response = client.chat.completions.create(
        model="qwen-turbo-latest",
        messages=[
            {
                "role": "system",
                "content": "You are a highly efficient agricultural content editor. Your output must be a single, clean JSON object mapping article IDs to their personalized summaries.",
            },
            {"role": "user", "content": prompt},
        ],
        stream=False,
        temperature=0.8,
    )

    try:
        content = response.choices[0].message.content
        if content.startswith("```json"):
            content = content[7:].strip()
        if content.endswith("```"):
            content = content[:-3].strip()
        data = json.loads(content)
        return data
    except (json.JSONDecodeError, AttributeError, KeyError) as e:
        print(f"JSON解析错误或API响应异常: {e}")
        print(f"原始响应内容: {response.choices[0].message.content}")
        return {}

def llm_generate_batch_summaries_keyword(user_info, articles_data, keywords):
    """
    根据用户搜索的关键词，为多篇文章生成个性化的摘要。

    :param user_info: 用户信息字典
    :param articles_data: 文章数据列表，每个元素是包含 'id', 'content' 的字典
    :param keywords: 用户搜索的关键词列表
    :return: 一个字典，键是文章id，值是生成的摘要
    """
    season = _get_current_season()
    
    # 将关键词列表合并为一个字符串
    keyword_str = ", ".join(keywords)

    articles_text = ""
    for article in articles_data:
        articles_text += f"--- Article Start (ID: {article['id']}) ---\n"
        articles_text += f"[Article Content]: {article['content']}\n"
        articles_text += f"--- Article End (ID: {article['id']}) ---\n\n"

    prompt = f"""你是一位顶级的农业内容个性化推荐专家。你的任务是为特定用户，根据其搜索的关键词，对下面提供的多篇文章进行个性化解读，并为每一篇生成一个高度相关的摘要。

[用户信息]:
{user_info}

[用户搜索的关键词]:
{keyword_str}

[当前季节]:
{season}

[文章列表]:
{articles_text}

[你的任务]:
1.  **理解上下文**: 仔细阅读用户信息、季节背景，以及用户搜索的关键词。
2.  **生成摘要**: 对列表中的每一篇文章，生成一段50-80字的个性化摘要。
3.  **融入搜索背景**: 在摘要中，必须巧妙地融入用户搜索的关键词。要让用户明白，这篇文章是基于他搜索的“关键词”而被推荐的。
4.  **禁止使用人名或称呼**: 在生成的摘要中，严禁使用任何形式的人名或称呼（如“您”、“陈师傅”等）。摘要应直接陈述内容。
5.  **提高多样性**: 请使用多样化的句式和表达方式来呈现推荐背景和文章内容，避免固定模式和重复。
6.  **严格JSON输出**: 你的输出必须是一个单一的JSON对象。键是文章的ID，值是为该文章生成的个性化摘要。

[输出格式示例]:
{{
  "0": "针对您关心的“变量施肥”技术，本文介绍了如何在春耕时节精准控制成本，实现更好的收成。",
  "1": "关于“品牌营销”的探讨，本文介绍了如何利用区域品牌提升价值，非常值得一看。",
  "2": "对于“产量预测”的分析，本文能为冬季规划提供重要参考。"
}}

请直接输出JSON对象，不要包含任何其他解释或注释。"""

    response = client.chat.completions.create(
        model="qwen-turbo-latest",
        messages=[
            {
                "role": "system",
                "content": "You are a highly efficient agricultural content editor. Your output must be a single, clean JSON object mapping article IDs to their personalized summaries.",
            },
            {"role": "user", "content": prompt},
        ],
        stream=False,
        temperature=0.8,
    )

    try:
        content = response.choices[0].message.content
        if content.startswith("```json"):
            content = content[7:].strip()
        if content.endswith("```"):
            content = content[:-3].strip()
        data = json.loads(content)
        return data
    except (json.JSONDecodeError, AttributeError, KeyError) as e:
        print(f"JSON解析错误或API响应异常: {e}")
        print(f"原始响应内容: {response.choices[0].message.content}")
        return {}

def llm_generate_recall_pipelines_new(user_info):
    prompt = f"""你是一位顶级的农业流程图设计师，专为用户量身定制从问题到解决方案的完整行动路径。

[用户画像]:
{user_info}

[你的任务]:
1.  **确立总流程 (1个)**: 深入分析用户画像，提炼出一个高度概括、目标明确的“总流程”。这个流程将作为最终JSON的唯一顶级键。它应该是一个简洁的动词短语，点明用户的核心目标，例如“实现番茄高产与品牌化”。
2.  **拆解分流程 (3-5个)**: 将“总流程”拆解为3-5个按时间或逻辑顺序排列的“分流程”。这些分流程必须是连续的、递进的步骤，共同构成实现总目标的完整路径。它们将作为嵌套JSON的键。
3.  **扩展关键词 (2-4个)**: 为每个“分流程”匹配2-4个简洁、核心的“关键词”，作为该步骤下的具体行动或关注点。
4.  **输出严格嵌套的JSON**: 你的输出必须是一个严格按照 `总流程 -> 分流程 -> 关键词` 结构嵌套的JSON对象。

[输出格式示例 - 针对一个想提升番茄附加值的种植户]:
{
{
  "番茄高效种植与附加值提升策略": {
    "产前规划": ["土壤健康管理", "优质品种引进", "设施环境升级"],
    "精细种管": ["水肥精准调控", "病虫害生态防控", "智能感知与生长监测"],
    "品质管控": ["分级采收与预冷处理", "产品标准化与品牌打造", "绿色/有机产品认证"],
    "品牌营销": ["订单农业对接", "数字化电商布局", "社区团购与社群运营"]
  }
}
}

请严格按照此结构，直接输出一个逻辑连贯、内容简洁的JSON对象，不要包含任何其他解释或注释。"""

    response = client.chat.completions.create(
        model="qwen-turbo-latest",
        messages=[
            {
                "role": "system",
                "content": "You are a top-tier agricultural flowchart designer. Your output must be a single, clean, nested JSON object representing a complete, sequential workflow.",
            },
            {"role": "user", "content": prompt},
        ],
        stream=False,
        temperature=0.2,  # 较低的温度以确保输出的结构性和相关性
    )

    try:
        content = response.choices[0].message.content
        # 移除可能的markdown代码块标记
        if content.startswith("```json"):
            content = content[7:].strip()
        if content.endswith("```"):
            content = content[:-3].strip()
        data = json.loads(content)

        # 检查返回的数据结构是否符合预期
        if not data or not isinstance(data, dict) or len(data) != 1:
            return None, {}

        # 解析出总流程和分流程字典
        total_process = list(data.keys())[0]
        final_recommendations = data[total_process]

        # 确保分流程部分也是一个字典
        if not isinstance(final_recommendations, dict):
            return total_process, {}

        return total_process, final_recommendations

    except (json.JSONDecodeError, AttributeError, KeyError, IndexError) as e:
        print(f"JSON解析错误或API响应异常: {e}")
        print(f"原始响应内容: {response.choices[0].message.content}")
        return None, {}

def llm_generate_recall_pipelines_professional(user_info):
    prompt = f"""你是一位具有前瞻性思维的顶级农业战略顾问和知识体系构建师，专注于为专业农户提供高效、高收益的智慧农业解决方案。你的任务是基于用户画像，构建一个全面、深入且覆盖全产业链的个性化知识推荐框架。

[用户画像]:
{user_info}

[你的任务]:
1.  **确立总流程 (1个)**: 深入分析用户画像，提炼出一个高度概括、目标明确的“总流程”。这个流程将作为最终JSON的唯一顶级键。它应该是一个简洁的动词短语，点明用户的核心目标，例如“实现番茄高产与品牌化”。
2.  **拆解分流程 (3-5个)**: 将“总流程”拆解为3-5个按时间或逻辑顺序排列的“分流程”。这些分流程必须是连续的、递进的步骤，共同构成实现总目标的完整路径。它们将作为嵌套JSON的键。
3.  **扩展关键词 (2-4个)**: 为每个“分流程”匹配2-4个简洁、核心的“关键词”，作为该步骤下的具体行动或关注点。
4.  **输出严格嵌套的JSON**: 你的输出必须是一个严格按照 `总流程 -> 分流程 -> 关键词` 结构嵌套的JSON对象。

[输出格式示例 - 针对一个想提升番茄附加值的种植户]:
{{
  "番茄高效种植与附加值提升策略": {{
    "产前规划": ["土壤健康管理", "优质品种引进", "设施环境升级"],
    "精细种管": ["水肥精准调控", "病虫害生态防控", "智能感知与生长监测"],
    "品质管控": ["分级采收与预冷处理", "产品标准化与品牌打造", "绿色/有机产品认证"],
    "品牌营销": ["订单农业对接", "数字化电商布局", "社区团购与社群运营"]
  }}
}}

请严格按照此结构，直接输出一个逻辑连贯、内容简洁的JSON对象，不要包含任何其他解释或注释。"""

    response = client.chat.completions.create(
        model="qwen-turbo-latest",
        messages=[
            {
                "role": "system",
                "content": "You are a top-tier agricultural flowchart designer. Your output must be a single, clean, nested JSON object representing a complete, sequential workflow.",
            },
            {"role": "user", "content": prompt},
        ],
        stream=False,
        temperature=0.2,  # 较低的温度以确保输出的结构性和相关性
    )

    try:
        content = response.choices[0].message.content
        # 移除可能的markdown代码块标记
        if content.startswith("```json"):
            content = content[7:].strip()
        if content.endswith("```"):
            content = content[:-3].strip()
        data = json.loads(content)

        # 检查返回的数据结构是否符合预期
        if not data or not isinstance(data, dict) or len(data) != 1:
            return None, {}

        # 解析出总流程和分流程字典
        total_process = list(data.keys())[0]
        final_recommendations = data[total_process]

        # 确保分流程部分也是一个字典
        if not isinstance(final_recommendations, dict):
            return total_process, {}

        return total_process, final_recommendations

    except (json.JSONDecodeError, AttributeError, KeyError, IndexError) as e:
        print(f"JSON解析错误或API响应异常: {e}")
        print(f"原始响应内容: {response.choices[0].message.content}")
        return None, {}

def llm_generate_recall_pipelines_caring(user_info):
    prompt = f"""你是一位充满智慧和共情能力的农业内容编辑，专为家庭农场或小农户提供贴心、实用的种植和生活建议。你的任务是为一位特定的用户，在特定的季节，对一篇文章进行个性化解读和摘要。

[用户信息]:
{user_info}

[你的任务]:
1.  **确立总流程 (1个)**: 深入分析用户画像，提炼出一个高度概括、目标明确的“总流程”。这个流程将作为最终JSON的唯一顶级键。它应该是一个简洁的动词短语，点明用户的核心目标，例如“实现番茄高产与品牌化”。
2.  **拆解分流程 (3-5个)**: 将“总流程”拆解为3-5个按时间或逻辑顺序排列的“分流程”。这些分流程必须是连续的、递进的步骤，共同构成实现总目标的完整路径。它们将作为嵌套JSON的键。
3.  **扩展关键词 (2-4个)**: 为每个“分流程”匹配2-4个简洁、核心的“关键词”，作为该步骤下的具体行动或关注点。
4.  **输出严格嵌套的JSON**: 你的输出必须是一个严格按照 `总流程 -> 分流程 -> 关键词` 结构嵌套的JSON对象。

[输出格式示例 - 针对一个想提升番茄附加值的种植户]:
{{
  "家庭农场绿色种植与健康生活": {{
    "土壤改良": ["有机肥使用", "土壤肥力提升", "轮作休耕", "土壤健康检测"],
    "病虫害防治": ["生物防治", "物理防治", "常见病虫害识别", "安全用药"],
    "农产品自销": ["社区直供", "农贸市场销售", "简单包装", "食品安全常识"]
  }}
}}

请严格按照此结构，直接输出一个逻辑连贯、内容简洁的JSON对象，不要包含任何其他解释或注释。"""

    response = client.chat.completions.create(
        model="qwen-turbo-latest",
        messages=[
            {
                "role": "system",
                "content": "You are a top-tier agricultural flowchart designer. Your output must be a single, clean, nested JSON object representing a complete, sequential workflow.",
            },
            {"role": "user", "content": prompt},
        ],
        stream=False,
        temperature=0.2,  # 较低的温度以确保输出的结构性和相关性
    )

    try:
        content = response.choices[0].message.content
        # 移除可能的markdown代码块标记
        if content.startswith("```json"):
            content = content[7:].strip()
        if content.endswith("```"):
            content = content[:-3].strip()
        data = json.loads(content)

        # 检查返回的数据结构是否符合预期
        if not data or not isinstance(data, dict) or len(data) != 1:
            return None, {}

        # 解析出总流程和分流程字典
        total_process = list(data.keys())[0]
        final_recommendations = data[total_process]

        # 确保分流程部分也是一个字典
        if not isinstance(final_recommendations, dict):
            return total_process, {}

        return total_process, final_recommendations

    except (json.JSONDecodeError, AttributeError, KeyError, IndexError) as e:
        print(f"JSON解析错误或API响应异常: {e}")
        print(f"原始响应内容: {response.choices[0].message.content}")
        return None, {}

